/* eslint-disable no-console */
(function ($) {
// ================================ 开关控件 ================================
    // 壁纸切换定时器变量
    let wallpaperInterval = null;

    /**
     * 更新开关状态（页面）
     * @param {string} key - 开关名称
     * @param {boolean} mode - 是否开启（true 或 false）
     */
    function toggleSwitch(key, mode) {
        const $switch = $(`input[name="${key}"]`);
        if($switch.length === 0) {
            console.error(`[module] 未找到开关控件: #${key}`);
            return;
        }
        $switch.bootstrapSwitch('state', mode);
    }

    /**
     * 更新开关对应的元素显示/隐藏状态
     * @param {string} key - 开关名称
     * @param {boolean} state - 开关状态
     */
    function toggleElementsWithSettings(key, state) {

        const toggleElement = ($element, state) => {
            if (state) {
                $element.show();
                $element.removeClass('force-hide');
            } else {
                $element.hide();
                $element.addClass('force-hide');
            }
        }

        const keyExists = key in window.switchConfigs.show || key in window.switchConfigs.hide;
        // 处理显示类开关
        if (window.switchConfigs.show[key]) {
            toggleElement( $(window.switchConfigs.show[key]), state);
        }
        // 处理隐藏类开关
        else if (window.switchConfigs.hide[key]) {
            toggleElement( $(window.switchConfigs.hide[key]), !state);
        } else {
            // 开关名称存在但没有配置元素时，不会打印警告信息
            if (!keyExists) {
                console.warn(`[module] 未知 Bootstrap Switch 开关: ${key}`);
            }
        }
    }

    /**
     * 更新开关状态（本地存储）
     * @param {string} key - 开关名称
     */
    function updateSwitchToLocalStorage(key){
        const checkStatus = window.getSettingsFromUserSettings(key, 'bootstrap-switch');
        // 方括号包裹变量名，才能将变量作为对象的键名，不然会直接使用 key 作为属性名
        window.AppUtils.updateLocalStorage('userSettings', {'bootstrap-switch': {[key]: checkStatus}});
    }

    /**
     * 自动切换壁纸
     * @param {string} key - 开关名称
     * @param {string} state - 开关状态
     */
    function autoSwitchWallpaper(key, state) {
        const interval = window.getSettingsFromUserSettings('switchInterval', 'range') || 30;
        if (key === 'autoSwitchWallpaper') {
             // 清除现有的定时器（如果存在）
            if (wallpaperInterval !== null) {
                clearInterval(wallpaperInterval);
                wallpaperInterval = null;
            }
            // 禁用或开启切换间隔
            $('input[name="switchInterval"]').prop('disabled', !state)
            if (state === true) {
                // 开启自动切换壁纸
                wallpaperInterval = setInterval(() => {
                    $('#windmill').trigger('click');
                }, interval * 60 * 1000);
                console.debug(`[module] [wallpaper] 自动切换壁纸已开启, 间隔${interval}分钟`);
            }
            if (wallpaperInterval === null) {
                console.debug('[module] [wallpaper] 自动切换壁纸已关闭');
            }
        }
    }

    /**
     * 监听所有开关切换事件
     */
    function bindSwitchEvents(config) {
        Object.keys(config).forEach(name => {
            $(`input[name="${name}"]`).on('switchChange.bootstrapSwitch', (event, state) => {
                updateSwitchToLocalStorage(name);
                toggleElementsWithSettings(name, state);
                autoSwitchWallpaper(name, state);
            });
        });
    }

    /**
     * 初始化所有开关状态及显示或隐藏对应开关的元素（页面）
     * @param {object} config - 开关配置对象
     */
    function bindInitSwitch(config) {
        Object.keys(config).forEach(name => {
            const state = window.getSettingsFromUserSettings(name, 'bootstrap-switch');
            const minimalMode = window.getSettingsFromUserSettings('displayMode', 'radio');
            // 标准模式或特别 key 下才触发
            if (minimalMode === false || name === 'autoSwitchWallpaper') {
                toggleSwitch(name, state);
                toggleElementsWithSettings(name, state);
            }
            autoSwitchWallpaper(name, state);
        });
    }

    function initSwitch() {
        bindInitSwitch(window.switchConfigs.show);
        bindInitSwitch(window.switchConfigs.hide);
        bindSwitchEvents(window.switchConfigs.show);
        bindSwitchEvents(window.switchConfigs.hide);
    }

    window.initSwitch = initSwitch;
    window.autoSwitchWallpaper = autoSwitchWallpaper;
    window.toggleSwitch = toggleSwitch;
    window.toggleElementsWithSettings = toggleElementsWithSettings;
})(window.jQuery);